【Hive】 udf
主要对比python的udf和java的udf。
python的udf 使用的是transform,是直接向操作系统申请资源,从而导致python脚本对内存和CPU的使用有问题。即mapper对应一个python脚本的执行和调用,当较多mapper并行执行时,会启动对应个数个python脚本(如果存在缓存文件,一样),所需资源是对应倍数。并且map占用的资源不会释放,会导致实质上python可用的资源较少。 实质就是python直接向操作系统请求资源而非yarn的任务管理器,从而导致集群的资源闲置而无法被释放
分配资源时会按照物理内存分配,资源划分给节点&节点管理(12.5%~25%),CPU核数(6%~12%),集群(逻辑划分)。而70%左右的集群会有最大物理内存,当没有map或者reduce时(shuffle)划分给集群的部分资源可悲系统使用,否则运行的JVM资源不会因为系统进程需要而被释放,从而导致map会一直等待python的运行结果而不释放其自身占的资源,集群所占的70%的资源无法高消利用,而其他资源由于资源不足可能会被kill
add add file test.py;
select transform(col) using 'python test.py' as column
from table;
java的udf则不会存在以上问题
其流程如下:
- 创建maven工程添加相关maven依赖并编写代码,然后将maven工程打包为jar包
- 将jar包上传至服务器
- 调用jar包,并转化相关类为执行函数
add jar test.jar;
list jar;
create temporary function trans as 'java.TestUDF';
select trans(col) as column from table;